dbt CloudのIPアドレスをSnowflakeのNetwork policy/ruleとして追加してみた

dbt CloudのIPアドレスをSnowflakeのNetwork policy/ruleとして追加してみた

Clock Icon2024.12.21

さがらです。

SnowflakeでIP制限などネットワークの制限をかける場合、Network policy/ruleを適用する必要があります。

https://docs.snowflake.com/en/user-guide/network-policies#interaction-between-allowed-lists-and-blocked-lists

既にSnowflakeでネットワーク制限の運用を行っている時にdbt Cloudを新しく採用したと仮定して、dbt CloudとSnowflakeが通信できるようにdbt CloudのIPアドレスをSnowflakeのNetwork policy/ruleとして追加してみたので、その内容を本記事でまとめてみます。

事前準備

まず、事前準備としてベースとなるNetwork policy/ruleをSnowflake上で設定しておきます。

最初に下記のクエリを実行して、Network policy/ruleを定義するためのデータベース・スキーマ・ロールを定義します。

https://docs.snowflake.com/ja/user-guide/network-rules#creating-a-network-rule

use role securityadmin;
create role network_admin;
grant role network_admin to user <ユーザー名>;
grant role network_admin to role sysadmin; -- カスタムロールのためsysadminにgrant

use role sysadmin;
create database securitydb;
use database securitydb;
create schema network_rules;

grant usage on database securitydb to role network_admin;
grant usage on schema securitydb.network_rules to role network_admin;
grant create network rule on schema securitydb.network_rules to role network_admin;

-- Network policyの作成も、作成したロールで行いたい場合は以下も実行
use role securityadmin;
grant create network policy on account to role network_admin;

次に、指定したIPのみ許可するNetwork policy/ruleの作成とアカウントレベルでの適用を行います。

※Network policyを適用できるのは、各アカウント・ユーザーごとに1つだけのため、ご注意ください。

use role network_admin;
create or replace network rule myhome_ip 
    type = ipv4 
    mode = ingress 
    value_list = ('xxx.xxx.xxx.xxx/32');

create or replace network policy accoutlevel_network_policy
  allowed_network_rule_list = ('myhome_ip');

use role accountadmin;
alter account set network_policy = accoutlevel_network_policy;

この設定を行った上で、別のIPアドレスからSnowflakeアカウントにログインしようとすると、下図のように表示されます。

2024-12-21_09h59_07

また、この設定を行った上で、dbt Cloudから対象のSnowflakeアカウントに対するdbt project作成時の接続テストを行おうとすると、エラーになります。

2024-12-21_10h06_59

dbt CloudのIPアドレスをSnowflakeのNetwork policy/ruleとして追加

dbt CloudからSnowflakeに接続ができるように、dbt CloudのIPアドレスをSnowflakeのNetwork policy/ruleとして追加してみます。

dbt CloudのIPアドレスの確認

dbt Cloudの公式ドキュメントでIPアドレスを確認可能です。

dbt CloudがホストされているリージョンによってIPアドレスが異なるため、ご注意ください。

2024-12-21_10h32_04

dbt CloudのIPアドレスをSnowflakeのNetwork policy/ruleとして追加

確認したdbt CloudのIPアドレスをSnowflakeのNetwork policy/ruleとして追加してみます。事前準備で作成したアカウント用のNetwork policyの定義を変更する形で実施します。

(弊社の環境が北米で動いているdbt Cloudのため、そのIPアドレスを指定しています。)

use role network_admin;
use database securitydb;
use schema network_rules;

create or replace network rule dbtcloud_ip 
    type = ipv4
    mode = ingress 
    value_list = ( '52.45.144.63','54.81.134.249','52.22.161.231','52.3.77.232','3.214.191.130','34.233.79.135');

alter network policy accoutlevel_network_policy
  set allowed_network_rule_list = ('myhome_ip','dbtcloud_ip');

この後で、再度dbt Cloudから対象のSnowflakeアカウントに対するdbt project作成時の接続テストを行おうとすると、無事に成功しました。

2024-12-21_11h05_26

おまけ

dbt Cloudの公式ドキュメントに下記の記載があるため、IPの指定ではなくホスト名の指定で対応した方が望ましいと思っています。

Dynamic IP addresses — dbt Cloud infrastructure uses Amazon Web Services (AWS). dbt Cloud offers static URLs for streamlined access, but the dynamic nature of cloud services means the underlying IP addresses change occasionally. AWS manages the IP ranges and may change them according to their operational and security needs.
Using hostnames for consistent access — To ensure uninterrupted access, we recommend that you use dbt Cloud services using hostnames. Hostnames provide a consistent reference point, regardless of any changes in underlying IP addresses. We are aligning with an industry-standard practice employed by organizations such as Snowflake.

…しかし、Snowflakeの公式ドキュメントを見ると、SnowflakeのNetwork ruleはホスト名の指定の場合MODE = EGRESSでしか作成ができなかったため、今回はIPアドレスの指定でNetwork ruleを作成しています。

HOST_PORT indicates that the network rule will allow outgoing network traffic based on the domain of the request destination.When TYPE = HOST_PORT, the MODE parameter should be set to EGRESS.

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.